package util;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

import modelUtil.Configuracion;
import modelUtil.Util;
import plantilla.BotonTO;
import plantilla.PlantillaTO;

public class TecladoReal extends Teclado{
	
	private static final long serialVersionUID = 1L;
	private PlantillaTO _plantilla;
	private List <BotonTO> _listaBotones;
	private List<PanelBotonEliminado> _huecos;
	private String os;

	
	public TecladoReal(JFrame contenedor, PlantillaTO plantilla, boolean barrido, int tiempoBarrido, boolean limpiarFrame){
		 super(contenedor, barrido, tiempoBarrido, limpiarFrame);
		 _plantilla = plantilla;
		 _huecos = detectarHuecos(_plantilla);

		 _listaBotones = _plantilla.getListaBotones();
		 _numFilas = new Integer(_plantilla.getNumeroFilas()).intValue(); 
		 _numColumnas = new Integer(_plantilla.getNumeroColumnas()).intValue();
		 os = System.getProperty("os.name");
		 init();
		 pintarTeclado();
		 _contenedor.setAlwaysOnTop(true);
	}
	
	
    public void init(){
    	Toolkit tk = Toolkit.getDefaultToolkit();
   	 	Dimension screenSize = tk.getScreenSize();
   	 	
   	 	_contenedor.setPreferredSize(new Dimension(new Integer(_plantilla.getAnchoTeclado()), new Integer(_plantilla.getAltoTeclado())));

   	 	int altoDock = (new Double(screenSize.getWidth()*0.045)).intValue();
   	 	
   	 	String posicion = _plantilla.getPosicionInicial();
   	 	Point pos = new Point();
   	 	_contenedor.setLayout(null);
   	 	
   	 	if(posicion.equals("SUPERIOR")){
   	   	 		_contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Integer(_plantilla.getAltoTeclado())));
	    	 	_contenedor.setLocation(0,0);
	    	 	pos.x = new Double(screenSize.getWidth()/2).intValue();
	    	 	pos.y = new Integer(_plantilla.getAltoTeclado())/2;
	    	 	Configuracion.instancia().setPosicion("SUPERIOR");
	    	 	Configuracion.instancia().setAnchoTeclado(new Double(screenSize.getWidth()).toString());
	    	 	Configuracion.instancia().setAltoTeclado(_plantilla.getAltoTeclado());

   	 	}else{
   	 		if (posicion.equals("INFERIOR")){
   	   	 		_contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Integer(_plantilla.getAltoTeclado())));
   	    	 	if(os.equalsIgnoreCase("Mac OS X"))
   	    	 		_contenedor.setLocation(0,screenSize.height - new Integer(_plantilla.getAltoTeclado()) - altoDock);
   	    	 	else
   	    	 	_contenedor.setLocation(0,screenSize.height - new Integer(_plantilla.getAltoTeclado()));
	    	 	pos.x = new Double(screenSize.getWidth()/2).intValue();
	    	 	pos.y = screenSize.height - new Integer(_plantilla.getAltoTeclado())/2;
	    	 	Configuracion.instancia().setPosicion("INFERIOR");
	    	 	Configuracion.instancia().setAnchoTeclado(new Double(screenSize.getWidth()).toString());
	    	 	Configuracion.instancia().setAltoTeclado(_plantilla.getAltoTeclado());
   	 		}else{
   	 			
   	 			if(posicion.equals("PANTALLA_COMPLETA")){
   	 			if(os.equalsIgnoreCase("Mac OS X"))
   	 				_contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Double(screenSize.getHeight()).intValue() - altoDock));
   	 			else	
   	 			    _contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Double(screenSize.getHeight()).intValue()));
   	 				_contenedor.setLocation(0,0);
   		    	 	pos.x = new Double(screenSize.getWidth()/2).intValue();
   		    	 	pos.y = screenSize.height/2;
   		    	 	Configuracion.instancia().setPosicion("PANTALLA_COMPLETA");
   		    	 	Configuracion.instancia().setAnchoTeclado(new Double(screenSize.getWidth()).toString());
   		    	 	Configuracion.instancia().setAltoTeclado(new Double(screenSize.getHeight()).toString());
   	 				
   	 			}else{
   	 				
   	 				if(posicion.equals("LIBRE")){
   	 		   	 	
   	 					_contenedor.setPreferredSize(new Dimension(new Integer(_plantilla.getAnchoTeclado()), new Integer(_plantilla.getAltoTeclado())));
   	   		    	 	_contenedor.setLocation((new Double((screenSize.getWidth()/2)-(new Integer(_plantilla.getAnchoTeclado())/2))).intValue(),(new Double((screenSize.getHeight()/2)-(new Integer(_plantilla.getAltoTeclado())/2))).intValue());
   	   		    	 	pos.x = new Double(screenSize.getWidth()/2).intValue();
   	   		    	 	pos.y = screenSize.height/2;
   	   		    	Configuracion.instancia().setPosicion("LIBRE");
   		    	 	Configuracion.instancia().setAnchoTeclado(_plantilla.getAnchoTeclado());
   		    	 	Configuracion.instancia().setAltoTeclado(_plantilla.getAltoTeclado());
   	 				
   	 				}
   	 			}
   	 			
   	 		}
   	 	}

   	 	try{
   	   	 	Robot robot = new Robot();
   	   	 	robot.mouseMove(pos.x,pos.y);
   	   	 	}catch(Exception u){
   	   	 		
   	   	 	}
   	 	
        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
     	c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        setLayout(gridbag);

        List <BotonPersonalizado> botones = new ArrayList<BotonPersonalizado>();
        _matrizBotones = new BotonPersonalizado [_numFilas][_numColumnas];

    	for(int z = 0; z < _listaBotones.size(); z++){
    		BotonPersonalizado _boton = Util.BotonImagen(_listaBotones.get(z),this);
    		int anchoTeclado = new Integer(_plantilla.getAnchoTeclado()).intValue();
    		int nColumnas = new Integer(_plantilla.getNumeroColumnas()).intValue();
    		int altoTeclado = new Integer(_plantilla.getAltoTeclado()).intValue();
    		int nFilas = new Integer(_plantilla.getNumeroFilas()).intValue();
    		int ancho = anchoTeclado/nColumnas;
    		int alto = altoTeclado/nFilas;
    		_boton.setPreferredSize(new Dimension(ancho*(new Integer(_boton.getBotonInfo().getColumnasOcupa()).intValue()),alto*(new Integer(_boton.getBotonInfo().getFilasOcupa()).intValue())));
    		_boton.setSize(new Dimension(ancho*(new Integer(_boton.getBotonInfo().getColumnasOcupa()).intValue()),alto*(new Integer(_boton.getBotonInfo().getFilasOcupa()).intValue())));

    		ImageIcon imagenicono = new ImageIcon(Configuracion.instancia().getDirUsuarioActual() + "//" +Configuracion.instancia().getTecladoActual() + "//" + _boton.getBotonInfo().getNombreIconoFichero());

    	if(imagenicono.getIconHeight()>0){
        	int altoImagen = imagenicono.getIconHeight();
        	int anchoImagen = imagenicono.getIconWidth();
        	double factorEscala =(altoImagen/(double)((80*_boton.getHeight())/100));
        	
        	if(ancho >= alto){
        		
    			
            	factorEscala = (altoImagen/(double)((80*_boton.getHeight())/100));

        		anchoImagen = ((int) (anchoImagen / factorEscala));
        		altoImagen = ((int) (80*_boton.getHeight())/100);

        		if(anchoImagen>_boton.getWidth()){
        			
                	factorEscala =(anchoImagen/(double)((80*_boton.getWidth())/100));

            		anchoImagen =  ((int) (80*_boton.getWidth())/100);
            		altoImagen = ((int) (altoImagen / factorEscala));

        		}

    		
    	}else{
    		
    			
            	factorEscala =(anchoImagen/(double)((80*_boton.getWidth())/100));

        		anchoImagen =  ((int) (80*_boton.getWidth())/100);
        		altoImagen = ((int) (altoImagen / factorEscala));

        		if(anchoImagen>_boton.getWidth()){
        			
                	factorEscala = (altoImagen/(double)((80*_boton.getHeight())/100));

            		anchoImagen = ((int) (anchoImagen / factorEscala));
            		altoImagen = ((int) (80*_boton.getHeight())/100);

        		}
        		
    		
    	}
    		
    		Image redimensionada = imagenicono.getImage().getScaledInstance(anchoImagen,altoImagen, Image.SCALE_DEFAULT);
    		imagenicono = new ImageIcon(redimensionada);
    		_boton.getLabelImagen().setIcon(imagenicono);
    		_boton.getLabelImagen().setPreferredSize(new Dimension(anchoImagen,altoImagen));
    	}else{
    		
    		imagenicono = new ImageIcon("lib//transparente.png");
    		int altoImagen = imagenicono.getIconHeight();
        	int anchoImagen = imagenicono.getIconWidth();
        	double factorEscala =(altoImagen/(double)((80*_boton.getHeight())/100));
        	        		
    		anchoImagen = ((int) (80*_boton.getWidth()) / 100);
    		altoImagen = ((int) (80*_boton.getHeight())/100);

    		
    		Image redimensionada = imagenicono.getImage().getScaledInstance(anchoImagen,altoImagen, Image.SCALE_DEFAULT);
    		imagenicono = new ImageIcon(redimensionada);
    		_boton.getLabelImagen().setIcon(imagenicono);
    		
    	}
    		botones.add(_boton);
    	}
    		
    	for(int i=0; i<_listaBotones.size(); i++){
    		c.gridx = new Integer(_listaBotones.get(i).getPosicionColumna()).intValue();
    		c.gridy = new Integer(_listaBotones.get(i).getPosicionFila()).intValue();
    		c.gridwidth = new Integer(_listaBotones.get(i).getColumnasOcupa()).intValue();
    		c.gridheight = new Integer(_listaBotones.get(i).getFilasOcupa()).intValue();
    		gridbag.setConstraints(botones.get(i), c);
    		add(botones.get(i)); 
    		_matrizBotones[c.gridy][c.gridx] = botones.get(i);
    	}
    	
    	for(int j=0;j<_huecos.size();j++){
    		c.gridx = _huecos.get(j).getColumna();
    		c.gridy = _huecos.get(j).getFila();

    		c.gridwidth = _huecos.get(j).getColsOcupa();
    		c.gridheight = _huecos.get(j).getFilasOcupa();

    		if(c.gridy>(_numFilas-1)){
    			
    		}else{
    			if(c.gridx>(_numColumnas-1)){
    	    		
    			}else{
    				//PanelBotonEliminado b = new PanelBotonEliminado(c,_frame,_contenedor);
    		    	PanelBotonEliminado b = _huecos.get(j);
    		    	b.setPreferredSize(new Dimension(b.getAncho(),b.getAlto()));
    		    	b.setSize(new Dimension(b.getAncho(),b.getAlto()));

    	    		ImageIcon imagenicono = new ImageIcon("lib//transparente.png");
    	    		int altoImagen = imagenicono.getIconHeight();
    	        	int anchoImagen = imagenicono.getIconWidth();
    	        	int ancho = b.getAncho();
    	        	int alto = b.getAlto();
    	        	double factorEscala;
	        		anchoImagen = ((int) (80*b.getWidth()) / 100);
	        		altoImagen = ((int) (80*b.getHeight())/100);
	        			    		

    	    		Image redimensionada = imagenicono.getImage().getScaledInstance(anchoImagen,altoImagen, Image.SCALE_DEFAULT);
    	    		imagenicono = new ImageIcon(redimensionada);
    	    		b.getFoto().setIcon(imagenicono);
    		    	
    		    	
    				gridbag.setConstraints(b, c);
    	    		add(b);
    			}
}
    		
    	}
    	
    	refrescar();
    }
    
    
	public List<PanelBotonEliminado> detectarHuecos(PlantillaTO plantilla){
		
		List<PanelBotonEliminado> botonesEliminados = new ArrayList<PanelBotonEliminado>();
		List<BotonTO> botones = plantilla.getListaBotones();
		int filas = new Integer(plantilla.getNumeroFilas()).intValue();
		int cols = new Integer(plantilla.getNumeroColumnas()).intValue();
		int ancho = new Integer(plantilla.getAnchoTeclado()).intValue() /cols;
		int alto = new Integer(plantilla.getAltoTeclado()).intValue() /filas;
		int tamaño = 0;
		
		
		Boolean [][] _matrizBotones = new Boolean[filas][cols];
		for(int i=0;i<filas;i++){
			for(int j=0; j<cols;j++){
				_matrizBotones[i][j]=true;
				tamaño++;
			}
			
		}
		
		tamaño = 0;

		for(int i=0;i<botones.size();i++){
			int filaBoton = new Integer(botones.get(i).getPosicionFila()).intValue();
			int colBoton = new Integer(botones.get(i).getPosicionColumna()).intValue();
			int filasOcupa = new Integer(botones.get(i).getFilasOcupa()).intValue();
			int colsOcupa = new Integer(botones.get(i).getColumnasOcupa()).intValue();
			for(int j=0; j<filasOcupa;j++){
				for(int k=0;k<colsOcupa;k++){
					
					_matrizBotones[filaBoton+j][colBoton+k]=false;
					tamaño++;
				}
			}
			
			
			
		}
		botonesEliminados = poblarHuecos(_matrizBotones, botonesEliminados,filas, cols,ancho,alto);
		
		return botonesEliminados;
	}
    
	
	public List<PanelBotonEliminado> poblarHuecos(Boolean[][] matriz,List<PanelBotonEliminado> botonesEliminados, int filas, int cols, int ancho, int alto){
		GridBagConstraints cons = new GridBagConstraints();
     	cons.fill = GridBagConstraints.BOTH;
     	//PanelBotonEliminado p;
		for(int i=0; i<filas;i++){
			for(int j=0; j<cols; j++){
				
				
				if(matriz[i][j]){
			     			cons.gridx = j;
			     			cons.gridy = i;
			     			cons.gridwidth = 1;
			     			cons.gridheight = 1;
			     			//PanelBotonEliminado p = new PanelBotonEliminado(cons,_frame, _frame.get_tecladoPrevisualizado(),ancho,alto);
			     			PanelBotonEliminado p = new PanelBotonEliminado(cons,ancho,alto);
			     			//p.addMouseListener(new AccionSeleccionPanelEliminado(p,_frame,_frame.get_tecladoPrevisualizado()));

			     			botonesEliminados.add(p);
					
					
				}
				
			}
			
		}
		

		
		return botonesEliminados;
	}
    
    
    
}
